import store from "@/store";
import axios from "axios";
import { Message } from "element-ui";

// 1. 服务器前缀地址如何统一？  axsio.create({ baseURL:服务器前缀 })
const instance = axios.create({
  // A.代码硬编码【写死在代码中】
  // baseURL: "http://139.196.82.122:3001/api/v1",
  // B.使用环境变量，创建环境变量文件 【环境文件的修改，需要重新启动服务器】
  baseURL: process.env.VUE_APP_SERVER_URL,
});
// 2. 请求业务地址如何统一管理？ 以独立的api接口文件定义接口  => src/api

// 5. 如果统一处理请求前的授权数据？ token 请求拦截器
instance.interceptors.request.use(
  function (config) {
    if (!config.isPublic) {
      config.headers.Authorization = "Bearer " + store.state.token;
    }

    return config;
  },
  function (error) {
    Message.error("请求失败");
    return Promise.reject(error);
  }
);

// 4. 如何统一处理请求失败错误？响应拦截器
instance.interceptors.response.use(
  function (response) {
    if (response.data.status >= 400) {
      Message.error(response.data.msg);
      return Promise.reject(response.data.msg);
    }
    // 对删除成功，添加成功，修改成功的统一提示
    if (response.data.status != 200) {
      Message.success(response.data.msg);
    }
    // 取出服务器的数据
    return response.data;
  },
  function (error) {
    Message.error("网络错误");
    return Promise.reject(error);
  }
);

// 3. 如何进行参数传递方式的统一化？对axios请求方法进行改造
const request = function (config = {}) {
  let method = config.method.toLocaleLowerCase();
  if (method == "post" || method == "put" || method == "patch") {
    config.data = config.params;
    delete config.params;
  }
  return instance.request(config);
};

export default request;
